<?php


	/**
	 * 生成带有签名数据
	 *
	 * @param $data
	 *
	 * @param
	 *
	 * @return array  带有签名的参数
	 * @throws
	 *
	 */
	function Signature ($data) {
		//
		$access_key_id = 'access_key_id_123456';
		$access_key_secret = 'access_key_secret_123456';

		$params = [
			'SignatureNonce'   => random(16, true),
			'SignatureVersion' => '1.0',
			'Timestamp'        => date("Y-m-d\TH:i:s.0000\Z"),
			'SignatureMethod'  => 'HMAC-SHA1',
			'AccessKeyId'      => $access_key_id,
			'Version'          => '2016-05-11',
		];

		$params = array_merge($params, $data);

		$params['Signature'] = computeSignature($params, $access_key_secret);

		return $params;
	}

	/**
	 * 根据签名机制生成签名
	 *
	 * @param $parameters       参数
	 * @param $accessKeySecret  秘钥
	 *
	 * @param
	 *
	 * @return string
	 * @throws
	 *
	 */
	function computeSignature ($parameters, $accessKeySecret) {
		// 将参数Key按字典顺序排序
		ksort($parameters);
		// 生成规范化请求字符串
		$canonicalizedQueryString = '';
		foreach ($parameters as $key => $value) {
			$canonicalizedQueryString .= '&' . percentEncode($key) . '=' . percentEncode($value);
		}
		// 生成用于计算签名的字符串 stringToSign
		$stringToSign = 'GET&%2F&' . percentEncode(substr($canonicalizedQueryString, 1));
		//echo "<br>".$stringToSign."<br>";
		// 计算签名，注意accessKeySecret后面要加上字符'&'
		$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));

		return $signature;
	}

	function percentEncode ($str) {
		// 使用urlencode编码后，将"+","*","%7E"做替换即满足ECS API规定的编码规范
		$res = urlencode($str);
		$res = preg_replace('/\+/', '%20', $res);
		$res = preg_replace('/\*/', '%2A', $res);
		$res = preg_replace('/%7E/', '~', $res);

		return $res;
	}

	/**
	 * 生成随机数
	 *
	 * @param      $length  长度
	 * @param bool $numeric 是否串数字
	 *
	 * @param
	 *
	 * @return string|null
	 * @throws
	 *
	 */
	function random ($length, $numeric = true) {
		$str = null;
		$mixture = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
		$number = '0123456789';
		$strBase = $numeric ? $number : $mixture;
		$max = strlen($strBase) - 1;

		for ($i = 0; $i < $length; $i++) {
			$str .= $strBase[rand(0, $max)];
		}

		return $str;
	}

	//xml格式转换成数组
	function XmlToArr ($xml) {
		libxml_disable_entity_loader(true);

		return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
	}

	/**
	 * 发送请求信息
	 * @param $data
	 *
	 * @return mixed
	 * @param
	 * @throws
	 *
	 */
	function send ($data) {
		$url = 'http://domain.aliyuncs.com/?';

		$params = Signature($data);
		$ret = XmlToArr(file_get_contents($url . http_build_query($params)));

		return $ret;
	}

	/**
	 * 提示
	 * @param      $msg   提示语
	 * @param int  $code  提示码
	 * @param null $data
	 *
	 * @return false|string
	 * @param
	 * @throws
	 *
	 */
	function toast ($msg, $code = -1, $data = null) {
		return json_encode(compact('code', 'msg', 'data'));
	}

	/**
	 * 分析
	 * 1.检测想要注册地的域名如：aaa.com是否已被注册过了
	 * 2.未被注册过,输入自己购买的域名生成未支付订单,其保留订单号
	 * 3.携带订单号查询订单,获得订单中的子订单列表
	 * 4.携带子订单列表，并保证余额充足的情况下自动完成了域名的注册
	 *
	 */


	#检测输入的待注册网站能否注册
	$DomainName = 'aaa.com';
	$Action = 'CheckDomain';
	$ret = send(compact('Action', 'DomainName'));
	#域名校验成功后,带着要注册的域名去生成一个订单
	if (array_key_exists('Avail', $ret) && $ret['Avail'] == 1) {
		#生成一个待支付的订单,且返回一个订单订单号为 AL2021083017099831的订单
		$Action = 'SaveBatchTaskForCreatingOrderActivate';
		$ret = send(compact('Action', 'DomainName'));
		if (array_key_exists('TaskNo', $ret)) {
			$OrderId = $ret['TaskNo'];
			$Action = 'QueryOrder';
			#3.订单成功后，通过订单编号查询订单中的子订单列表
			$ret = send(compact('Action', 'OrderId'));
			if (array_key_exists('OrderProducts', $ret)) {
				$SubOrderParam = $ret['OrderProducts'];
				$Action = 'CreateOrder';
				#创建购买订单并完成支付,这里要保证余额充足
				$ret = send(compact('Action', 'SubOrderParam'));
				if (array_key_exists('OrderID', $ret)) {
					return toast('下单成功');
				}

				//暂定余额不足
				return toast('余额不足');
			}

			//没有看到实际的数据,暂定为查询订单失败的提示
			return toast('查询订单失败');
		}

		//暂定注册失败
		return toast('注册失败');
	}

	//反馈会前端
	return toast('该' . $DomainName . '暂不能注册');

